package curso.maven.infra.servico;

import java.util.HashMap;
import java.util.Map;

/**
 * Usa um mapa interno para guardar e localizar os objetos de servico.
 * Instancias desta classe podem ser registradas como a instancia padrao
 * a ser retornada por LocalizadorServico.instanciaPadrao().
 */
public class LocalizadorServicoMapa extends LocalizadorServico {
	private Map<String, Object> servicos;
	
	/**
	 * Cria um LocalizadorServico com uma colecao de objetos de servico.
	 * @param servicos objetos de servico
	 */
	public LocalizadorServicoMapa(Map<String, Object> servicos) {
		this.servicos = new HashMap<String, Object>(servicos);
	}
	
	/**
	 * Registra esta instancia como a instancia padrao a ser retornada
	 * por LocalizadorServico.instanciaPadrao().
	 */
	public void registrarInstanciaPadrao() {
		super.registrarInstanciaPadrao(this);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public <T> T servicoPorTipo(Class<T> tipoServico) {
		for (Object servico : servicos.values()) {
			if (tipoServico.isAssignableFrom(servico.getClass())) {
				return (T) servico;
			}
		}
		throw new ExcecaoLocalizadorServico("Servico por tipo nao encontrado: " + tipoServico);
	}

	@Override
	@SuppressWarnings("unchecked")
	public <T> T servicoPorNome(Class<T> tipoServico, String nomeServico) {
		Object servico = servicos.get(nomeServico);
		if (servico != null && tipoServico.isAssignableFrom(servico.getClass())) {
			return (T) servico;
		}
		throw new ExcecaoLocalizadorServico("Servico por nome nao encontrado: " + nomeServico);
	}
}
